package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import util.DBUtils;

public class PrepareStatementDemo {
	
	@Test
	public void insert() throws SQLException {
		// 1. 得到连接
		Connection c = DBUtils.getConnection();
		// 2. 得到预处理句柄
		String sql = "insert into dept values(?,?,?)";
		PreparedStatement ps = c.prepareStatement(sql);
		// 3. 替换真是的值, 问号从1开始，setXXX类型看的是数据库对应的类型
		ps.setInt(1,200);
		ps.setString(2, "b");
		ps.setString(3, "b");
		// 4.执行
		int row = ps.executeUpdate();
		System.out.println(row);
		// 5.关闭
		ps.close();
		c.close();
	}
	
	@Test
	public void update() throws SQLException {
		// 1. 得到连接
		Connection c = DBUtils.getConnection();
		// 2. 得到预处理句柄
		String sql = "update dept set dname=?,loc=? where deptno=?";
		PreparedStatement ps = c.prepareStatement(sql);
		// 3. 替换真是的值, 问号从1开始，setXXX类型看的是数据库对应的类型
		ps.setString(1, "bbb");
		ps.setString(2, "bbb");
		ps.setInt(3, 200);
		// 4.执行
		int row = ps.executeUpdate();
		System.out.println(row);
		// 5.关闭
		ps.close();
		c.close();
	}
	
	@Test
	public void delete() throws SQLException {
		// 1. 得到连接
		Connection c = DBUtils.getConnection();
		// 2. 得到预处理句柄
		String sql = "delete from dept where deptno=?";
		PreparedStatement ps = c.prepareStatement(sql);
		// 3. 替换真实的值, 问号从1开始，setXXX类型看的是数据库对应的类型
		ps.setInt(1, 200);
		// 4.执行
		int row = ps.executeUpdate();
		System.out.println(row);
		// 5.关闭
		ps.close();
		c.close();
	}
	
	@Test
	public void select() throws SQLException {
		// 1. 得到连接
		Connection c = DBUtils.getConnection();
		// 2. 得到预处理句柄
		String sql = "select deptno,dname,loc from dept where deptno = ?";
		PreparedStatement ps = c.prepareStatement(sql);
		// 3. 替换真实的值, 问号从1开始，setXXX类型看的是数据库对应的类型
		ps.setInt(1, 10);
		// 4.执行
		ResultSet set = ps.executeQuery();
		while (set.next()) {
			// %d占位整数，%s占位字符串，%c占位char, %f占位浮点
			System.out.printf("deptno=%d,dname=%s,loc=%s\n",set.getInt(1),set.getString(2),set.getString(3));
		}
		// 5.关闭
		ps.close();
		c.close();
	}
	
	@Test
	public void select2() throws SQLException {
		// 1. 得到连接
		Connection c = DBUtils.getConnection();
		// 2. 得到预处理句柄
		String sql = "select count(*),max(sal),min(sal) from emp";
		PreparedStatement ps = c.prepareStatement(sql);
		// 3. 替换真实的值, 问号从1开始，setXXX类型看的是数据库对应的类型
		//ps.setInt(1, 10);
		// 4.执行
		ResultSet set = ps.executeQuery();
		while (set.next()) {
			System.out.printf("count=%d,maxsal=%d,minsal=%d",set.getInt(1),set.getInt(2),set.getInt(3));
		}
		// 5.关闭
		ps.close();
		c.close();
	}
}
